//负责数据劫持
//把$data中的成员转换成getter/setter

class Observer {
    constructor (data) {
        this.walk(data)
    }

    //1.判断data是否是对象，如果不是对象返回
    //2.如果是对象，遍历对象的所有属性，设置为getter/setter
    walk (data) {
         if(!data || typeof data !== 'object'){
             return 
         }
         //遍历data的所有成员
         Object.keys(data).forEach(key => {
             this.defineReactive(data,key,data[key])
         })
    }
    //定义响应式成员
    defineReactive(data,key,val) {
        let that = this
        //创建dep对象收集依赖
        const dep = new Dep()
        //如果val是对象，继续设置它下面的成员成为响应式数据
        this.walk(val)
        Object.defineProperty(data,key, {
            enumerable:true,
            configurable:true,
            get () {
                //get的过程中收集依赖
                Dep.target && dep.addSub(Dep.target)
                return val
            },
            set(newValue) {
                if(newValue === val){
                    return
                }
                val = newValue
                //如果newValue是对象，设置newValue的成员成为响应式
                that.walk(newValue)
                //当数据变化时，发送通知
                dep.notify()
            }
        })

    }
}
